package com.hub.netty.server.handler;

import com.hub.netty.base.domain.Message;
import com.hub.netty.base.domain.MessageEnum;
import com.hub.netty.server.config.ChannelMap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.AttributeKey;
import lombok.extern.slf4j.Slf4j;

import java.util.Objects;

/**
 * @ author 令狐冲
 * @ date & time 2025/2/5 16:55
 */
@Slf4j
public class ServerListenerHandler extends SimpleChannelInboundHandler<Message> {

    /**
     * 设备接入连接时处理
     *
     * @param ctx
     */
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) {
        log.info("有新的连接：[{}]", ctx.channel().id().asLongText());
        ctx.channel().writeAndFlush(new Message(ctx.channel().id().asLongText(), 1));
    }

    /**
     * 数据处理
     *
     * @param ctx
     * @param msg
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Message msg) {
        if (Objects.equals(MessageEnum.CONNECT.getType(), msg.getMsgType())) {
            ctx.channel().writeAndFlush(new Message(ctx.channel().id().asLongText(), 1));
        }

    }

    /**
     * 设备下线处理
     *
     * @param ctx
     */
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) {
        log.info("设备下线了:{}", ctx.channel().id().asLongText());
        removeId(ctx);
    }

    /**
     * 设备连接异常处理
     *
     * @param ctx
     * @param cause
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // 打印异常
        log.info("异常：{}", cause.getMessage());
        // 关闭连接
        ctx.close();
        removeId(ctx);
    }

    private void removeId(ChannelHandlerContext ctx) {
        AttributeKey<String> key = AttributeKey.valueOf("id");
        // 获取channel中id
        String id = ctx.channel().attr(key).get();
        // map移除channel
        ChannelMap.removeChannel(id);
    }
}
